package global

import (
	"fmt"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
)

var (
	LoggerStartDate string // 日志开启时间
	logInfoFile     *os.File
	logErrorFile    *os.File
)

func InitLogger() *zap.Logger {

	// 如果未开启日志，则创建日志文件
	if CONFIG.Server.LogStatus == false {
		return nil
	}

	// 创建日志目录
	logDir := CONFIG.Server.LogPath
	err := os.MkdirAll(logDir, os.ModePerm)
	if err != nil {
		panic(fmt.Errorf("failed to create log directory: %v", err))
	}

	logInfoFileName := fmt.Sprintf("%s/info-%s.log", logDir, LoggerStartDate)
	logErrorFileName := fmt.Sprintf("%s/error-%s.log", logDir, LoggerStartDate)

	// 打开文件，如果文件不存在则创建，追加模式写入
	logInfoFile, err = os.OpenFile(logInfoFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		panic(fmt.Errorf("failed to open log file: %v", err))
	}

	// 打开文件，如果文件不存在则创建，追加模式写入
	logErrorFile, err = os.OpenFile(logErrorFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		panic(fmt.Errorf("failed to open log file: %v", err))
	}

	// 配置日志核心
	encoderConfig := zapcore.EncoderConfig{
		MessageKey:   "message",
		LevelKey:     "level",
		TimeKey:      "timestamp",
		CallerKey:    "caller",
		EncodeLevel:  zapcore.LowercaseLevelEncoder,
		EncodeTime:   zapcore.ISO8601TimeEncoder,
		EncodeCaller: zapcore.ShortCallerEncoder,
	}

	// 创建Encoder
	encoder := zapcore.NewConsoleEncoder(encoderConfig)

	//// 创建自定义 WriteSyncer, 将日志写入文件
	fileInfoSyncer := zapcore.AddSync(logInfoFile)
	fileErrorSyncer := zapcore.AddSync(logErrorFile)

	// 创建多个WriteSyncer，一个用于文件，一个用于终端
	allSyncers := []zapcore.WriteSyncer{fileInfoSyncer}

	// 创建WriteSyncer，将日志输出到os.Stdout（终端）
	if CONFIG.Server.OutputTerminal {
		stdoutSyncer := zapcore.AddSync(os.Stdout)
		allSyncers = append(allSyncers, stdoutSyncer)
	}

	// 将多个WriteSyncer合并成一个
	multiSyncer := zapcore.NewMultiWriteSyncer(allSyncers...)

	// 创建核心
	infoCore := zapcore.NewCore(
		encoder,
		multiSyncer,
		zapcore.DebugLevel,
	)
	errorCore := zapcore.NewCore(
		encoder,
		fileErrorSyncer,
		zapcore.ErrorLevel,
	)

	// 创建 Logger
	logger := zap.New(zapcore.NewTee(infoCore, errorCore))
	return logger
}

func CloseLogger() {
	err := logInfoFile.Close()
	if err != nil {
		panic("logInfoFile-Close-Err")
	}

	err = logErrorFile.Close()
	if err != nil {
		panic("logErrorFile-Close-Err")
	}
}
